#ifndef AutoHideDockContainerH
#define AutoHideDockContainerH
/*******************************************************************************
** Qt Advanced Docking System
** Copyright (C) 2017 Uwe Kindler
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/


//============================================================================
/// \file   AutoHideDockContainer.h
/// \author Syarif Fakhri
/// \date   05.09.2022
/// \brief  Declaration of CAutoHideDockContainer class
//============================================================================

//============================================================================
//                                   INCLUDES
//============================================================================
#include "ads_globals.h"

#include <QSplitter>
#include "AutoHideTab.h"

class QXmlStreamWriter;

namespace ads
{
    struct AutoHideDockContainerPrivate;
    class CDockManager;
    class CDockWidget;
    class CDockContainerWidget;
    class CAutoHideSideBar;
    class CDockAreaWidget;
    class CDockingStateReader;
    struct SideTabBarPrivate;

    /**
     * 自动隐藏容器，用于承载自动隐藏的停靠窗口
     */
    class ADS_EXPORT CAutoHideDockContainer : public QFrame
    {
        Q_OBJECT
        Q_PROPERTY(int sideBarLocation READ sideBarLocation)

    private:
        AutoHideDockContainerPrivate* d; ///< 私有数据 (pimpl)
        friend struct AutoHideDockContainerPrivate;
        friend CAutoHideSideBar;
        friend SideTabBarPrivate;

    protected:
        virtual bool eventFilter(QObject* watched, QEvent* event) override;
        virtual void resizeEvent(QResizeEvent* event) override;
        virtual void leaveEvent(QEvent *event) override;
        virtual bool event(QEvent* event) override;

        /**
         * 根据大小限制和调整大小边距更新大小
         */
        void updateSize();

        /*
         * 保存状态和大小
         */
        void saveState(QXmlStreamWriter& Stream);

    public:
        using Super = QFrame;

        /**
         * 使用给定的停靠窗口创建自动隐藏小部件
         */
        CAutoHideDockContainer(CDockWidget* DockWidget, SideBarLocation area,
            CDockContainerWidget* parent);

        /**
         * 虚析构函数
         */
        virtual ~CAutoHideDockContainer();

        /**
         * 获取侧边栏
         */
        CAutoHideSideBar* autoHideSideBar() const;

        /**
         * 返回侧边栏选项卡
         */
        CAutoHideTab* autoHideTab() const;

        /**
         * 获取此停靠容器中的停靠窗口
         */
        CDockWidget* dockWidget() const;

        /**
         * 返回侧边栏中此容器的索引
         */
        int tabIndex() const;

        /**
         * 添加停靠窗口并移除先前的停靠窗口
         */
        void addDockWidget(CDockWidget* DockWidget);

        /**
         * 返回此自动隐藏停靠容器的侧边栏位置
         */
        SideBarLocation sideBarLocation() const;

        /**
         * 设置新的侧边栏位置。
         * 如果设置了新的侧边栏位置，自动隐藏停靠容器需要更新其调整大小句柄的位置
         */
        void setSideBarLocation(SideBarLocation SideBarLocation);

        /**
         * 返回此自动隐藏停靠容器的停靠区窗口
         */
        CDockAreaWidget* dockAreaWidget() const;

        /**
         * 返回承载此自动隐藏容器的父容器
         */
        CDockContainerWidget* dockContainer() const;

        /**
         * 将内容移动到父容器窗口
         * 在删除此自动隐藏停靠容器之前使用
         */
        void moveContentsToParent();

        /**
         * 清理并删除侧边选项卡小部件
         */
        void cleanupAndDelete();

        /*
         * 切换自动隐藏停靠容器小部件的显示/隐藏状态
         * 这也会隐藏侧边选项卡小部件
         */
        void toggleView(bool Enable);

        /*
         * 折叠自动隐藏停靠容器小部件
         * 不隐藏侧边选项卡小部件
         */
        void collapseView(bool Enable);

        /**
         * 切换当前折叠状态
         */
        void toggleCollapseState();

        /**
         * 使用此方法代替resize。
         * 根据侧边栏位置设置宽度或高度。
         */
        void setSize(int Size);

        /**
         * 将宽度或高度重置为初始停靠窗口大小，取决于方向。
         * 如果方向为Qt::Horizontal，则将高度重置为初始大小；
         * 如果方向为Qt::Vertical，则将宽度重置为初始大小。
         */
        void resetToInitialDockWidgetSize();

        /**
         * 返回容器的方向。
         * 左侧和右侧容器的方向为Qt::Vertical，顶部/底部容器的方向为Qt::Horizontal。
         * 该函数返回相应自动隐藏侧边栏的方向。
         */
        Qt::Orientation orientation() const;

        /**
         * 从当前侧边栏中移除自动隐藏容器，并将其添加到给定的新侧边栏中（SideBarLocation）
         */
        void moveToNewSideBarLocation(SideBarLocation SideBarLocation, int TabIndex = -1);
    };
} // namespace ads

//-----------------------------------------------------------------------------
#endif
